home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue30 / datalink / ComponentDatalink.pas
Encoding:
Pascal/Delphi Source File  |  1997-11-27  |  5.7 KB  |  211 lines

  1. unit ComponentDataLink;
  2.  
  3.  
  4.  
  5. interface
  6.  
  7.  
  8.  
  9. uses
  10.  
  11.   DB, DBTables, BDE, Classes;
  12.  
  13.  
  14.  
  15. type
  16.  
  17.   TComponentDataLink = class(TDataLink)
  18.  
  19.   private
  20.  
  21.     fComponent: TComponent;
  22.  
  23.     fDataSet: TDataSet;
  24.  
  25.     fDataSetName: string;
  26.  
  27.     fIndexNames: string;
  28.  
  29.     fOnNewDataSet: TDataSetNotifyEvent;
  30.  
  31.     fOnDataSetOpen: TDataSetNotifyEvent;
  32.  
  33.     fOnDataSetChange: TDataSetNotifyEvent;
  34.  
  35.     fOnIndexChange: TDataSetNotifyEvent;
  36.  
  37.     fOnLayoutChange: TDataSetNotifyEvent;
  38.  
  39.     fOnPostData: TDataSetNotifyEvent;
  40.  
  41.     fOnDataSetClose: TDataSetNotifyEvent;
  42.  
  43.     fOnInvalidDataSet: TDataSetNotifyEvent;
  44.  
  45.     fOnInvalidDataSource: TDataSetNotifyEvent;
  46.  
  47.     fOnDestroyDataLink: TDataSetNotifyEvent;
  48.  
  49.   protected
  50.  
  51.     function GetDataSetName: string; virtual;
  52.  
  53.     procedure SetDataSetName(Value: string); virtual;
  54.  
  55.     procedure ActiveChanged; override;
  56.  
  57.     procedure CheckBrowseMode; override;
  58.  
  59.     procedure DataSetChanged; override;
  60.  
  61.     procedure DataSetScrolled(Distance: Integer); override;
  62.  
  63.     procedure FocusControl(Field: TFieldRef); override;
  64.  
  65.     procedure EditingChanged; override;
  66.  
  67.     procedure LayoutChanged; override;
  68.  
  69.     procedure RecordChanged(Field: TField); override;
  70.  
  71.     procedure UpdateData; override;
  72.  
  73.   public
  74.  
  75.     constructor Create(AComponent: TComponent); virtual;
  76.  
  77.     destructor Destroy; override;
  78.  
  79.     property DataSetName: string
  80.  
  81.              read GetDataSetName
  82.  
  83.              write SetDataSetName;
  84.  
  85.     property OnNewDataSet: TDataSetNotifyEvent
  86.  
  87.              read fOnNewDataSet
  88.  
  89.              write fOnNewDataSet;
  90.  
  91.     property OnDataSetOpen: TDataSetNotifyEvent
  92.  
  93.              read fOnDataSetOpen
  94.  
  95.              write fOnDataSetOpen;
  96.  
  97.     property OnDataSetChange: TDataSetNotifyEvent
  98.  
  99.              read fOnDataSetChange
  100.  
  101.              write fOnDataSetChange;
  102.  
  103.     property OnIndexChange: TDataSetNotifyEvent
  104.  
  105.              read fOnIndexChange
  106.  
  107.              write fOnIndexChange;
  108.  
  109.     property OnLayoutChange: TDataSetNotifyEvent
  110.  
  111.              read fOnLayoutChange
  112.  
  113.              write fOnLayoutChange;
  114.  
  115.     property OnPostData: TDataSetNotifyEvent
  116.  
  117.              read fOnPostData
  118.  
  119.              write fOnPostData;
  120.  
  121.     property OnDataSetClose: TDataSetNotifyEvent
  122.  
  123.              read fOnDataSetClose
  124.  
  125.              write fOnDataSetClose;
  126.  
  127.     property OnInvalidDataSet: TDataSetNotifyEvent
  128.  
  129.              read fOnInvalidDataSet
  130.  
  131.              write fOnInvalidDataSet;
  132.  
  133.     property OnInvalidDataSource: TDataSetNotifyEvent
  134.  
  135.              read fOnInvalidDataSource
  136.  
  137.              write fOnInvalidDataSource;
  138.  
  139.     property OnDestroyDataLink: TDataSetNotifyEvent
  140.  
  141.              read fOnDestroyDataLink
  142.  
  143.              write fOnDestroyDataLink;
  144.  
  145.   end;
  146.  
  147.  
  148.  
  149. implementation
  150.  
  151.  
  152.  
  153. constructor TComponentDataLink.Create(AComponent: TComponent);
  154.  
  155. begin
  156.  
  157.   inherited Create;
  158.  
  159.   fComponent := AComponent;
  160.  
  161. end;
  162.  
  163.  
  164.  
  165. destructor TComponentDataLink.Destroy;
  166.  
  167. begin
  168.  
  169.   if Assigned(fOnDestroyDataLink) then
  170.  
  171.     fOnDestroyDataLink(DataSet);
  172.  
  173.   inherited Destroy;
  174.  
  175. end;
  176.  
  177.  
  178.  
  179. function TComponentDataLink.GetDataSetName: string;
  180.  
  181. begin
  182.  
  183.   Result := fDataSetName;
  184.  
  185.   if DataSet <> nil then
  186.  
  187.     Result := DataSet.Name;
  188.  
  189.   if DataSet is TTable then
  190.  
  191.     Result := TTable(DataSet).TableName;
  192.  
  193.   if DataSet is TQuery then
  194.  
  195.     if DataSet.DataSource <> nil then
  196.  
  197.       Result := TTable(TQuery(DataSet).DataSource.DataSet).TableName;
  198.  
  199. end;
  200.  
  201.  
  202.  
  203. procedure TComponentDataLink.SetDataSetName(Value: string);
  204.  
  205. begin
  206.  
  207.   if fDataSetName <> Value then
  208.  
  209.     fDataSetName := Value;
  210.  
  211. end;
  212.  
  213.  
  214.  
  215. procedure TComponentDataLink.ActiveChanged;
  216.  
  217. begin
  218.  
  219.   if Active then
  220.  
  221.   begin
  222.  
  223.     fDataSet := DataSet;
  224.  
  225.     if DataSetName <> fDataSetName then
  226.  
  227.     begin
  228.  
  229.       fDataSetName := DataSetName;
  230.  
  231.       fIndexNames := TTable(fDataSet).IndexFieldNames;
  232.  
  233.       if Assigned(fOnNewDataSet) then
  234.  
  235.         fOnNewDataSet(DataSet);
  236.  
  237.     end
  238.  
  239.     else
  240.  
  241.     begin
  242.  
  243.       fIndexNames := TTable(DataSet).IndexFieldNames;
  244.  
  245.       if Assigned(fOnDataSetOpen) then
  246.  
  247.         fOnDataSetOpen(DataSet);
  248.  
  249.     end;
  250.  
  251.   end
  252.  
  253.   else
  254.  
  255.   begin
  256.  
  257.     if DataSet = nil then
  258.  
  259.     begin
  260.  
  261.       if Assigned(fOnInvalidDataSource) then
  262.  
  263.         fOnInvalidDataSource(fDataSet);
  264.  
  265.       fDataSet := nil;
  266.  
  267.       fDataSetName := '<INVALID>';
  268.  
  269.       fIndexNames := '';
  270.  
  271.     end
  272.  
  273.     else
  274.  
  275.     begin
  276.  
  277.       if (csDestroying in DataSet.ComponentState) then
  278.  
  279.       begin
  280.  
  281.         if Assigned(fOnInvalidDataSet) then
  282.  
  283.           fOnInvalidDataSet(fDataSet);
  284.  
  285.         fDataSet := nil;
  286.  
  287.         fDataSetName := '<INVALID>';
  288.  
  289.         fIndexNames := '';
  290.  
  291.       end
  292.  
  293.       else
  294.  
  295.       begin
  296.  
  297.         if Assigned(fOnDataSetClose) then
  298.  
  299.           fOnDataSetClose(DataSet);
  300.  
  301.         if DataSet <> nil then
  302.  
  303.         begin
  304.  
  305.           fDataSetName := DataSetName;
  306.  
  307.           fIndexNames := TTable(DataSet).IndexFieldNames;
  308.  
  309.         end;
  310.  
  311.       end;
  312.  
  313.     end;
  314.  
  315.   end;
  316.  
  317. end;
  318.  
  319.  
  320.  
  321. procedure TComponentDataLink.CheckBrowseMode;
  322.  
  323. begin
  324.  
  325.  
  326.  
  327. end;
  328.  
  329.  
  330.  
  331. procedure TComponentDataLink.DataSetChanged;
  332.  
  333. begin
  334.  
  335.   if TTable(DataSet).IndexFieldNames <> fIndexNames then
  336.  
  337.   begin
  338.  
  339.     fIndexNames := TTable(DataSet).IndexFieldNames;
  340.  
  341.     if Assigned(fOnIndexChange) then
  342.  
  343.       fOnIndexChange(DataSet);
  344.  
  345.   end
  346.  
  347.   else
  348.  
  349.     if Assigned(fOnDataSetChange) then
  350.  
  351.       fOnDataSetChange(DataSet);
  352.  
  353. end;
  354.  
  355.  
  356.  
  357. procedure TComponentDataLink.DataSetScrolled(Distance: Integer);
  358.  
  359. begin
  360.  
  361.  
  362.  
  363. end;
  364.  
  365.  
  366.  
  367. procedure TComponentDataLink.FocusControl(Field: TFieldRef);
  368.  
  369. begin
  370.  
  371.  
  372.  
  373. end;
  374.  
  375.  
  376.  
  377. procedure TComponentDataLink.EditingChanged;
  378.  
  379. begin
  380.  
  381.  
  382.  
  383. end;
  384.  
  385.  
  386.  
  387. procedure TComponentDataLink.LayoutChanged;
  388.  
  389. begin
  390.  
  391.   if Assigned(fOnLayoutChange) then
  392.  
  393.     fOnLayoutChange(DataSet);
  394.  
  395. end;
  396.  
  397.  
  398.  
  399. procedure TComponentDataLink.RecordChanged(Field: TField);
  400.  
  401. begin
  402.  
  403.  
  404.  
  405. end;
  406.  
  407.  
  408.  
  409. procedure TComponentDataLink.UpdateData;
  410.  
  411. begin
  412.  
  413.  
  414.  
  415. end;
  416.  
  417.  
  418.  
  419. end.
  420.  
  421.